﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using db = XRM.Security.DataAccess.Models;

namespace XRM.Security.WebUI.Models.InfoSystem
{
    public class InfoSystemModel : BaseViewModel, IValidatableObject
    {
        public InfoSystemModel()
        {
            FileList = new List<InfoSystemFileModel>();
        }

        public InfoSystemModel(db.InfoSystem dbEntity)
        {
            FileList = new List<InfoSystemFileModel>();
            
            if (dbEntity != null)
            {
                Id = dbEntity.InfoSystemId;
                InfoSystemName = dbEntity.InfoSystemName;
                DomainGroup = dbEntity.DomainGroup;
                InMaintenance = dbEntity.InMaintenance;
                Operator = dbEntity.Operator;
                OperatorContact = dbEntity.OperatorContact;
                Developer = dbEntity.Developer;
                Support = dbEntity.Support;
                Comment = dbEntity.Comment;
                DateIn = dbEntity.DateIn;
                DateOut = dbEntity.DateOut;

                GetFiles(dbEntity.Files.ToList());
            }
        }

        public void GetFiles(List<db.InfoSystemFile> list)
        {
            FileList = new List<InfoSystemFileModel>();
            if (list != null && list.Any())
            {
                foreach (db.InfoSystemFile item in list)
                {
                    FileList.Add(new InfoSystemFileModel(item));
                }
            }
        }

        [AllowHtml]
        [Display(Name = "Наименование")]
        [Required(ErrorMessage = "Поле 'Наименование' обязательное")]
        [MaxLength(100, ErrorMessage = "Максимальная длина поля 'Наименование' 100 символов")]
        public string InfoSystemName { get; set; }

        [AllowHtml]
        [Display(Name = "Группа домена")]
        [MaxLength(100, ErrorMessage = "Максимальная длина поля 'Группа домена' 100 символов")]
        public string DomainGroup { get; set; }

        [Display(Name = "Статус")]
        public bool InMaintenance { get; set; }

        [AllowHtml]
        [Display(Name = "Оператор")]
        [MaxLength(200, ErrorMessage = "Максимальная длина поля 'Оператор' 200 символов")]
        public string Operator { get; set; }

        [AllowHtml]
        [Display(Name = "Контактное лицо оператора")]
        [MaxLength(500, ErrorMessage = "Максимальная длина поля 'Контактное лицо оператора' 500 символов")]
        public string OperatorContact { get; set; }

        [AllowHtml]
        [Display(Name = "Организация-разработчик")]
        [MaxLength(200, ErrorMessage = "Максимальная длина поля 'Организация-разработчик' 200 символов")]
        public string Developer { get; set; }

        [AllowHtml]
        [Display(Name = "Сопровождающая организация")]
        [MaxLength(200, ErrorMessage = "Максимальная длина поля 'Сопровождающая организация' 200 символов")]
        public string Support { get; set; }

        [AllowHtml]
        [Display(Name = "Примечание")]
        public string Comment { get; set; }

        [Display(Name = "Дата создания")]
        public DateTime DateIn { get; set; }
        [Display(Name = "Дата вывода из эксплуатации")]
        public DateTime? DateOut { get; set; }

        public string FileUploadUrl { get; set; }

        public List<MaintenanceListItem> StatusList
        {
            get
            {
                List<MaintenanceListItem> result = new List<MaintenanceListItem>();
                result.Add(new MaintenanceListItem { Value = true, Text = "Эксплуатируемая" });
                result.Add(new MaintenanceListItem { Value = false, Text = "Неэксплуатируемая" });
                return result;
            }
        }

        public string StatusCaption
        {
            get
            {
                return InMaintenance ? "Эксплуатируемая" : "Неэксплуатируемая";
            }
        }

        public bool CanDelete { get; set; }
        
        public List<InfoSystemFileModel> FileList { get; set; }
        
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            yield break;
        }
    }

    public class MaintenanceListItem
    {
        public bool Value { get; set; }
        public string Text { get; set; }
    }
}